/**
 * 解析器内部也分了好几个子解析器，比如HTML解析器，文本解析器以及过滤器解析器。其中最主要的就是HTML解析器。作用就是解析HTML，在解析过程中不断触发钩子函数。
 * 这些钩子函数包括开始标签钩子函数，结束标签钩子函数，文本钩子函数，以及注释节点钩子函数。
 */

// 伪代码
// function parseHTML(template, {
//   start(tag, attr, unary){
//     //解析到标签的开始位置时，触发该函数。
//   },
//    end(tag, attr, unary){
//   //解析到标签的结束位置时，触发该函数。
// },
// chars(text){
//   //解析到文本时，触发该函数。
// },
// comment(text){
//   //解析到注释时，触发该函数。
// },
// })

{/* <div><p>我是xxx</p></div> */ }
// 触发钩子顺序应该是   start 进栈  start 进栈  chars end 出栈 end 出栈（执行完一组开始结束节点标签会弹出栈并被记录下来。）   也就是说，解析器其实是从前往后开始进行解析的。 

